// 引入redis数据库
const redisClient = require('../db/redis')
// 引入mysql数据库
const { db, execTransAction } = require('../db/mysql')
// 导入bcryptjs，用于对用户密码进行加密
const bCryptJs = require('bcryptjs')
// 导入生成token字符的三方库
const jsonWebToken = require('jsonwebtoken')
const config = require('../config')
const fs = require('fs')

//#region
// 商家用户注册
exports.pusUserRegister = async (req, res) => {
  // 获取用户传递过来的数据
  const phone = req.body.phone // 获取用户手机号
  const userSendCode = req.body.code
  // 将用户密码进行加密
  const password = bCryptJs.hashSync(req.body.password)
  // 获取redis数据库中保存的验证码
  const code = await redisClient.get(`sms_${phone}`)
  // 验证码已过期
  if (!code) {
    return res.cc('验证码已过期，请重新获取后再试')
  }
  // 验证码错误
  if (code !== userSendCode) {
    return res.cc('验证码错误')
  }

  // 查找数据库中是否有数据,改手机号是否已经注册
  const sql = `select * from bus_users where bus_phone=?`
  // 执行sql语句
  db.query(sql, phone, async (err, results) => {
    // 执行sql语句错误
    if (err) {
      return res.cc(err)
    }
    // 数据库中已经存在该用户
    if (results.length === 1) {
      return res.cc('该用户已注册，请更换号码重试')
    }
    // 检查用户名是否已经被占用
    const sql = `select * from bus_users where bus_name=?`
    // 执行sql语句查询用户名是否被占用
    db.query(sql, req.body.name, async (err, results) => {
      // 执行sql语句失败
      if (err) {
        return res.cc(err)
      }
      // 用户名已经被占用
      if (results.length !== 0) {
        return res.cc('用户名被占用，请更换后重试')
      }
      // 保存用户数据
      const sql = `insert into bus_users set ?`
      // 执行sql语句保存数据
      db.query(sql, { bus_name: req.body.name, bus_password: password, bus_phone: phone }, async (err, results) => {
        // 执行sql语句失败
        if (err) {
          return res.cc(err)
        }
        // 插入失败
        if (results.affectedRows !== 1) {
          return res.cc('注册失败')
        }
        // 清除redis数据库中的验证码
        await redisClient.del(`sms_${phone}`)
        // 注册成功
        res.cc('注册成功', 0)
      })
    })
  })
}

// 商家用户登录
exports.pusUserLogin = async (req, res) => {
  // 第一种登录方式：手机号验证码登录
  const phone = req.body.phone
  if (phone) {
    // 电话号码存在就是验证码登录
    const sql = `select * from bus_users where bus_phone=?`
    // 查询数据库中的数据
    db.query(sql, phone, async (err, results) => {
      if (err) return res.cc(err)
      if (results.length === 0) return res.cc('该手机号未注册')
      // 执行成功，判断验证码是否正确
      const code = req.body.code
      // 连接redis数据库，从redis数据库中获取验证码

      const redisCode = await redisClient.get('sms_' + phone)
      if (!redisCode) {
        return res.cc('验证码已过期或手机号码错误')
      }
      //验证码错误
      if (code !== redisCode) {
        return res.cc('验证码错误')
      }
      // 登录成功，删除redis数据库中的验证码并且生成token字符串返回给用户
      await redisClient.del('sms_' + phone)
      // 生成token字符串
      const token = jsonWebToken.sign({ ...results[0], bus_password: '' }, config.secretKey, { expiresIn: '48h' })
      // 将用户token保存在redis数据库中
      await redisClient.set('bus_token_' + results[0].bus_id, 'Bearer ' + token)
      await redisClient.expire('bus_token_' + results[0].bus_id, 172800)
      res.send({
        code: 0,
        msg: '登录成功',
        token: 'Bearer ' + token
      })
    })
  } else {
    // 第二种登录方式：账号密码登录
    const name = req.body.name
    const password = req.body.password
    const sql = `select * from bus_users where bus_name=?`
    db.query(sql, name, async (err, results) => {
      if (err) return res.cc(err)
      if (results.length === 0) return res.cc('该账号不存在')
      // 执行成功，判断用户提交的密码是否正确
      const result = bCryptJs.compareSync(password, results[0].bus_password) // 返回布尔值，相同返回true
      if (!result) return res.cc('密码错误！')
      // 生成token字符串
      const token = jsonWebToken.sign({ ...results[0], bus_password: '' }, config.secretKey, { expiresIn: '48h' })
      // 将用户token字符串保存在redis数据库中

      await redisClient.set('bus_token_' + results[0].bus_id, 'Bearer ' + token)
      await redisClient.expire('bus_token_' + results[0].bus_id, 172800)
      res.send({
        code: 0,
        msg: '登录成功',
        token: 'Bearer ' + token
      })
    })
  }
}

// 商家找回密码
exports.forgetPassword = async (req, res) => {
  // 获取用户手机号
  const phone = req.body.phone
  const sql = `select * from bus_users where bus_phone=?`
  db.query(sql, phone, async (err, results) => {
    if (err) return res.cc(err)
    if (results.length === 0) return res.cc('该手机号还未注册')
    // 建立与redis数据库连接，获取验证码

    const code = await redisClient.get('sms_' + phone)
    if (!code) {
      // 没有获取到验证码

      return res.cc('验证码过期或手机号错误')
    }
    // 验证码错误
    if (code !== req.body.code) {
      return res.cc('验证码错误')
    }

    // 删除redis数据库中的验证码并断开连接
    await redisClient.del('sms_' + phone)

    // 将用户新密码加密后保存
    const password = bCryptJs.hashSync(req.body.newPassword)
    const sql = `update bus_users set bus_password=? where bus_phone=?`
    db.query(sql, [password, phone], (err, results) => {
      if (err) return res.cc(err)
      if (results.affectedRows !== 1) return res.cc('找回密码失败')
      res.cc('密码找回成功', 0)
    })
  })
}

// 商家注销账号
exports.cancellation = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }
  const id = req.auth.bus_id
  // 1. 定义sql语句删除账号
  const sql = `delete from bus_users where bus_id=?`
  db.query(sql, id, (err, results) => {
    if (err) return res.cc(err)
    if (results.affectedRows !== 1) return res.cc('注销账户失败')
    // 2. 删除商家发布的分类

    // 3. 删除商家发布的商品

    // 4. 删除商家产生的订单

    // 5. 删除商家产生的账单

    // 5. 返回响应
    res.cc('注销账号成功', 0)
  })
}

// 商家用户退出登录
exports.logout = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }
  // 根据用户信息查看数据库中是否存在账号
  const sql = `select * from bus_users where bus_id=?`
  db.query(sql, req.auth.bus_id, async (err, results) => {
    if (err) return res.cc(err)
    if (results.length === 0) return res.cc('身份信息不存在，请更换后重试')
    // 删除redis数据库中的token字符串
    try {
      const token = await redisClient.get('bus_token_' + req.auth.bus_id)
      if (!token) return res.cc('token检验无效') // 没有获取到token信息
      // 用户传递的token与保存的身份不一致
      if (token !== req.headers.authorization) return res.cc('身份认证信息失败')
      await redisClient.del('bus_token_' + req.auth.bus_id)
      res.send({
        code: 0,
        msg: '退出登录成功'
      })
    } catch (err) {
      res.cc(err)
    } finally {
    }
  })
}

// 商家用户添加分类
exports.addCate = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }
  // 判断分类是否已经存在
  const getNameSql = `select * from goods_cates where name=? and bus_id=?`
  db.query(getNameSql, [req.body.cate_name, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length > 0) return res.cc('该分类已存在！')
    // 1. 判断用户提供的分类是几级分类
    const super_id = req.body.super_id
    let sql = ''
    if (super_id) {
      // 新增的分类必须为二级分类
      if (req.body.level === '一级') return res.cc('一级分类不存在上级分类！')
      // 判断上级是否存在
      const getCateSql = `select * from goods_cates where id=? and bus_id=?`
      db.query(getCateSql, [super_id, req.auth.bus_id], (err, result) => {
        if (err) return res.cc(err)
        if (result.length === 0) return res.cc('上级分类不存在！')
        // 3. 将分类信息保存在数据库
        let sql = `insert into goods_cates set ?`
        db.query(
          sql,
          [
            {
              name: req.body.cate_name,
              level: req.body.level,
              super_id,
              is_show: req.body.is_show,
              nav_show: req.body.nav_show,
              bus_id: req.auth.bus_id
            }
          ],
          (err, result) => {
            if (err) return res.cc(err)
            if (result.affectedRows !== 1) return res.cc('添加分类失败！')
            // 4. 返回响应
            res.cc('添加分类成功！', 0)
          }
        )
      })
    } else {
      // 分类必须是一级分类
      if (req.body.level === '二级') return res.cc('分类级别错误，二级分类必须拥有上级分类！')
      // 添加的分类是一级分类
      sql = `insert into goods_cates set ?`
      db.query(
        sql,
        [
          {
            name: req.body.cate_name,
            level: req.body.level,
            is_show: req.body.is_show,
            nav_show: req.body.nav_show,
            bus_id: req.auth.bus_id
          }
        ],
        (err, result) => {
          if (err) return res.cc(err)
          if (result.affectedRows !== 1) return res.cc('添加分类失败！')
          // 4. 返回响应
          res.cc('添加分类成功！', 0)
        }
      )
    }
  })
}

// 获取商品分类
exports.getCateList = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }
  // 2. 查询数据库中的分类数据
  const sql = `select * from goods_cates where bus_id=? and level='一级'`
  db.query(sql, req.auth.bus_id, (err, result) => {
    if (err) {
      return res.cc(err)
    }

    res.send({
      code: 0,
      msg: '获取分类列表成功！',
      data: result
    })
  })
}

// 删除指定分类
exports.delCategory = async (req, res) => {
  // 1. 判断用户身份是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份信息已过期！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('用户身份信息错误！', 403)

  // 2. 获取分类id并判断分类是否存在
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]
  if (!/^\d+$/.test(id)) return res.cc('id必须是数字！')

  // 判断该分类是否存在
  const sql = `select * from goods_cates where id=? and bus_id=?`
  db.query(sql, [id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 0) return res.cc('该分类不存在！')
    const level = result[0].level

    if (level === '二级') {
      // 3. 判断是一级分类还是二级分类，如果是二级分类直接删除
      const sql = `delete from goods_cates where id=?`
      db.query(sql, id, (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc('删除失败！')
        res.cc('删除分类成功！', 0)
      })
    }

    if (level === '一级') {
      // 4. 如果是一级分类先删除一级分类，然后再删除一级分类的下级分类
      const sql = `delete from goods_cates where id=? and bus_id=?`
      db.query(sql, [id, req.auth.bus_id], (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc('删除失败！')
        // 判断当前分类是否具有下级分类
        const sql = `select * from goods_cates where super_id=? and bus_id=?`
        db.query(sql, [id, req.auth.bus_id], (err, result) => {
          if (err) return res.cc(err)
          if (result.length > 0) {
            const sql = `delete from goods_cates where super_id=? and bus_id=?`
            db.query(sql, [id, req.auth.bus_id], (err, result) => {
              if (err) return res.cc(err)
              if (result.affectedRows === 0) return res.cc('删除失败！')
              // 5. 返回响应
              res.cc('删除分类成功！', 0)
            })
          } else {
            res.cc('删除成功！', 0)
          }
        })
      })
    }
  })
}

// 获取二级分类
exports.getSonCategoryList = async (req, res) => {
  // 1. 判断用户身份是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份信息已过期！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('用户身份信息错误！', 403)
  // 2. 获取用户传递的id
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]
  const sql = `select * from goods_cates where super_id=? and bus_id=?`
  // 3. 根据id查询数据库中的二级分类列表
  db.query(sql, [id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    // 4. 返回响应
    res.send({
      code: 0,
      msg: '获取二级分类列表成功！',
      data: result
    })
  })
}

// 编辑分类
exports.editCategory = async (req, res) => {
  // 1. 判断用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份信息已过期！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('用户身份信息错误！', 403)
  // 2. 获取分类id并判断该分类是否存在
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]
  const sql = `select * from goods_cates where id=? and bus_id=?`
  db.query(sql, [id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 0) return res.cc('当前修改的分类不存在！')
    // if (result[0].level === '二级') return res.cc('上级分类必须是一级分类！')
    // 3. 判断用户传递的分类和分类id关系，如果是一级分类，不能传递上级分类，如果是二级分类，必须传递上级分类id
    const sql = `update goods_cates set name=?, level=?, super_id=?,is_show=?, nav_show=? where id=?`
    if (req.body.level === '一级') {
      if (req.body.super_id) return res.cc('一级分类不存在上级分类！')
      // 4. 执行sql语句，修改数据库内容
      db.query(sql, [req.body.cate_name, req.body.level, null, req.body.is_show, req.body.nav_show, id], (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc('修改分类信息失败！')
        // 5. 返回响应
        res.cc('更新成功！', 0)
      })
    }
    if (req.body.level === '二级') {
      if (!req.body.super_id) return res.cc('二级分类必须存在上级分类！')
      // 判断用户传递的上级分类是否存在
      const haveSuper = `select * from goods_cates where id=? and bus_id=?`
      db.query(haveSuper, [req.body.super_id, req.auth.bus_id], (err, result) => {
        if (err) return res.cc(err)
        if (result.length === 0) return res.cc('上级分类不存在！')
        // 4. 执行sql语句，修改数据库内容
        db.query(sql, [req.body.cate_name, req.body.level, req.body.super_id, req.body.is_show, req.body.nav_show, id], (err, result) => {
          if (err) return res.cc(err)
          if (result.affectedRows !== 1) return res.cc('更新分类信息失败！')
          // 5. 返回响应
          res.cc('更新成功！', 0)
        })
      })
    }
  })
}

// 根据id获取商品分类
exports.getCategoryById = async (req, res) => {
  // 1. 判断用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份信息已过期！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('用户身份信息错误！', 403)
  // 2. 查询数据库中的数据信息
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]
  const sql = `select * from goods_cates where id=? and bus_id=?`
  db.query(sql, [id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 0) return res.cc('查询的商品分类信息不存在！')
    res.send({
      code: 0,
      msg: '获取商品分类信息成功！',
      data: result[0]
    })
  })
}

// 添加商品
exports.addGoods = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 验证商品是否存在
  const sql = `select * from goods where article_no=? and goods_name=? and cate_id=? and bus_id=?`
  db.query(sql, [req.body.no, req.body.name, req.body.cate_id, req.auth.bus_id], (err, result) => {
    if (err) res.cc(err)
    if (result.length > 0) return res.cc('该商品已存在！')
    // 2. 验证商品分类是否存在
    const sql = `select * from goods_cates where id=? and bus_id=?`
    db.query(sql, [req.body.cate_id, req.auth.bus_id], (err, result) => {
      if (err) return res.cc(err)
      if (result.length === 0) return res.cc('商品分类不存在！')

      // 3. 将商品图片保存在静态文件夹中
      const imgData = req.body.src
      const base64Data = imgData.replace(/^data:image\/\w+;base64,/, '')

      const Readable = require('stream').Readable

      const imgBuffer = Buffer.from(base64Data, 'base64')

      const s = new Readable()

      s.push(imgBuffer)
      s.push(null)

      try {
        const date = new Date()
        const time = date.getTime()
        const randomNo = Math.floor(Math.random() * 10)
        s.pipe(fs.createWriteStream('./public/goods_img/' + time + req.auth.bus_id + randomNo + '.' + req.body.img_type))
        const path = '/api/goods_img/' + time + req.auth.bus_id + randomNo + '.' + req.body.img_type
        // 创建添加商品的时间和更新商品数据时间
        const create_time = date.toLocaleDateString() + ' ' + date.toLocaleTimeString()
        // 4. 将商品数据添加至服务器中保存
        // 定义sql语句保存数据
        const sql = `insert into goods set ?`
        db.query(
          sql,
          {
            goods_name: req.body.name,
            goods_desc: req.body.desc,
            goods_img: path,
            goods_price: req.body.price,
            goods_stock: req.body.count,
            goods_sell_num: 0,
            create_time: create_time,
            update_time: create_time,
            is_selling_fragrance: 0,
            bus_id: req.auth.bus_id,
            cate_id: req.body.cate_id,
            is_recommend: req.body.recommend,
            is_new: req.body.new,
            specs: req.body.specs,
            article_no: req.body.no,
            is_banner: req.body.banner
          },
          (err, result) => {
            if (err) return res.cc(err)
            if (result.affectedRows !== 1) return res.cc('添加商品失败！')
            // 5. 返回响应
            res.cc('添加成功！', 0)
          }
        )
      } catch (err) {
        return res.cc(err)
      }
    })
  })
}

// 获取商品列表
exports.getGoodsList = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 2. 根据用户id获取商品数据
  const sql = `select * from goods where bus_id=?`
  try {
    const result = await execTransAction([{ sql, values: req.auth.bus_id }])

    if (result.length === 0) {
      res.send({
        code: 0,
        msg: '暂无商品数据！',
        data: []
      })
    } else {
      res.send({
        code: 0,
        msg: '获取商品数据成功！',
        data: result[0].rows
      })
    }
  } catch (err) {
    res.cc(err)
  }
}

// 删除商品
exports.delGoods = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 2. 获取用户传递的id
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]
  // 3. 根据id获取商品图片路径，并将本地图片删除
  const sql = `select goods_img from goods where id=? and bus_id=?`
  db.query(sql, [id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 0) return res.cc('商品信息不存在！')
    // 获取本地图片路径
    const filePath = result[0].goods_img.replace('/api', './public')
    // 4. 根据id删除商品
    const sql = `delete from goods where id=? and bus_id=?`
    db.query(sql, [id, req.auth.bus_id], (err, result) => {
      if (err) return res.cc(err)
      if (result.affectedRows !== 1) return res.cc('删除失败！')
      // 5. 删除本地图片
      // 删除原来的头像
      fs.unlink(filePath, (err) => {
        if (err) throw err
      })
      res.cc('删除成功！', 0)
    })
  })
}

// 根据id获取商品信息
exports.getGoodsById = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)
  // 2. 获取路径参数所带的id
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]

  // 3. 根据id获取商品信息
  const sql = `select * from goods where id=? and bus_id=?`
  db.query(sql, [id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 0) return res.cc('获取商品信息失败！')
    // 根据分类id获取上级分类id
    const sql = `select super_id from goods_cates where id=? and bus_id=?`
    db.query(sql, [result[0].cate_id, req.auth.bus_id], (err, results) => {
      if (err) return res.cc(err)
      if (results[0].super_id) {
        // 用户上级id
        res.send({
          code: 0,
          msg: '获取商品信息成功！',
          data: { ...result[0], cate_arr: [results[0].super_id, result[0].cate_id] }
        })
      } else {
        // 没有上级id
        res.send({
          code: 0,
          msg: '获取商品信息成功！',
          data: { ...result[0], cate_arr: [result[0].cate_id] }
        })
      }
    })
  })
}

// 根据条件筛选数据库数据
exports.filterGoodsList = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)
  // 2. 根据用户传递的数据编辑sql语句
  // 默认情况下全部不为空
  let sql = `select * from goods where goods_name=? and article_no=? and cate_id=? and is_new=? and is_recommend=? and bus_id=?`
  const name = req.query.name
  const specs = req.query.specs
  const cate_id = req.query.cate_id
  const is_new = req.query.is_new
  const is_recommend = req.query.is_recommend
  let params = [name, specs, cate_id, is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  //#region
  // 全部筛选条件都为空
  if (name === '' && specs === '' && cate_id === '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where bus_id=?`
    params = [req.auth.bus_id]
  }
  // 只有商品名称为空
  if (name === '' && specs !== '' && cate_id !== '' && is_new !== '0' && is_recommend !== '0') {
    sql = `select * from goods where article_no=? and is_new=? and is_recommend=? and cate_id=? and  bus_id=?`
    params = [specs, is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', cate_id, req.auth.bus_id]
  }
  // 只有商品货号为空
  if (name !== '' && specs === '' && cate_id !== '' && is_new !== '0' && is_recommend !== '0') {
    sql = `select * from goods where goods_name=? and is_new=? and is_recommend=? and cate_id=? and bus_id=?`
    params = [name, is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', cate_id, req.auth.bus_id]
  }
  // 只有分类为空
  if (name !== '' && specs !== '' && cate_id === '' && is_new !== '0' && is_recommend !== '0') {
    sql = `select * from goods where goods_name=? and article_no=? and is_new=? and is_recommend=? and bus_id=?`
    params = [name, specs, is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 只有是否是新品为空
  if (name !== '' && specs !== '' && cate_id !== '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where goods_name=? and article_no=? and cate_id=? and is_recommend=? and bus_id=?`
    params = [name, specs, cate_id, is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }

  // 只有是否是推荐为空
  if (name !== '' && specs !== '' && cate_id !== '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and article_no=? and cate_id=? and is_new=?  and bus_id=?`
    params = [name, specs, cate_id, is_new === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和商品货号都为空
  if (name == '' && specs == '' && cate_id !== '' && is_new !== '0' && is_recommend !== '0') {
    sql = `select * from goods where cate_id=? and is_new=? and is_recommend=? and bus_id=?`
    params = [cate_id, is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和商品分类为空
  if (name === '' && specs !== '' && cate_id === '' && is_new !== '0' && is_recommend !== '0') {
    sql = `select * from goods where article_no=? and is_new=? and is_recommend=? and bus_id=?`
    params = [specs, is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和是否是新品为空
  if (name === '' && specs !== '' && cate_id !== '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where article_no=? and cate_id=? and is_recommend=? and bus_id=?`
    params = [specs, cate_id, is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和是否是推荐为空
  if (name === '' && specs !== '' && cate_id !== '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where article_no=? and cate_id=? and is_new=? and bus_id=?`
    params = [specs, cate_id, is_new === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品货号和分类为空
  if (name !== '' && specs === '' && cate_id === '' && is_new !== '0' && is_recommend !== '0') {
    sql = `select * from goods where goods_name=? and is_new=? and is_recommend=? and bus_id=?`
    params = [name, is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品货号和是否是新品为空
  if (name !== '' && specs === '' && cate_id !== '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where goods_name=? and cate_id=? and is_recommend=? and bus_id=?`
    params = [name, cate_id, is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品货号和是否是推荐为空
  if (name !== '' && specs === '' && cate_id !== '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and cate_id=? and is_new=? and bus_id=?`
    params = [cate_id, cate_id, is_new === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 分类和是否是新品为空
  if (name !== '' && specs !== '' && cate_id === '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where goods_name=? and article_no=? and is_recommend=? and bus_id=?`
    params = [name, specs, , is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 分类和是否是推荐为空
  if (name !== '' && specs !== '' && cate_id === '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and article_no=? and is_new=? and bus_id=?`
    params = [name, specs, is_new === '1' ? '1' : '0', req.auth.bus_id]
  }

  // 是否是新品和是否是推荐为空
  if (name !== '' && specs !== '' && cate_id !== '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and article_no=? and cate_id=? and bus_id=?`
    params = [name, specs, cate_id, req.auth.bus_id]
  }
  // 商品名称和商品货号和分类为空
  if (name === '' && specs === '' && cate_id === '' && is_new !== '0' && is_recommend !== '0') {
    sql = `select * from goods where is_new=? and is_recommend=? and bus_id=?`
    params = [is_new === '1' ? '1' : '0', is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }

  // 商品名称和商品货号和是否是新品为空
  if (name === '' && specs === '' && cate_id !== '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where cate_id=? and is_recommend=? and bus_id=?`
    params = [cate_id, is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和商品货号和是否是推荐为空
  if (name === '' && specs === '' && cate_id !== '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where cate_id=? and is_new=? and bus_id=?`
    params = [cate_id, is_new === '1' ? '1' : '0', req.auth.bus_id]
  }

  // 商品名称和商品分类和是否是新品为空
  if (name === '' && specs !== '' && cate_id === '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where article_no=? and is_recommend=? and bus_id=?`
    params = [specs, is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和商品分类和是否是推荐为空
  if (name === '' && specs !== '' && cate_id === '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where article_no=? and is_new=? and bus_id=?`
    params = [specs, is_new === '1' ? '1' : '0', req.auth.bus_id]
  }

  // 商品名称和是否是新品和是否是推荐为空
  if (name === '' && specs !== '' && cate_id !== '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where article_no=? and cate_id=? and bus_id=?`
    params = [specs, cate_id, req.auth.bus_id]
  }
  // 商品货号和商品分类和是否是新品为空
  if (name !== '' && specs === '' && cate_id === '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where goods_name=? and is_recommend=? and bus_id=?`
    params = [name, is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品货号和商品分类和是否是推荐为空
  if (name !== '' && specs === '' && cate_id === '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and is_new=? and bus_id=?`
    params = [name, is_new === '1' ? '1' : '0', req.auth.bus_id]
  }

  // 商品货号和是否是新品和是否是推荐为空
  if (name !== '' && specs === '' && cate_id !== '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and cate_id=? and bus_id=?`
    params = [name, cate_id, req.auth.bus_id]
  }
  // 商品分类和是否是新品和是否是推荐为空
  if (name !== '' && specs !== '' && cate_id === '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and article_no=? and bus_id=?`
    params = [name, specs, req.auth.bus_id]
  }
  // 商品名称和商品货号和商品分类和是否是新品为空
  if (name === '' && specs === '' && cate_id === '' && is_new === '0' && is_recommend !== '0') {
    sql = `select * from goods where is_recommend=? and bus_id=?`
    params = [is_recommend === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和商品货号和商品分类和是否是推荐为空
  if (name === '' && specs === '' && cate_id === '' && is_new !== '0' && is_recommend === '0') {
    sql = `select * from goods where is_new=? and bus_id=?`
    params = [is_new === '1' ? '1' : '0', req.auth.bus_id]
  }
  // 商品名称和商品分类和是否是新品和是否是推荐为空
  if (name === '' && specs !== '' && cate_id === '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where article_no=? and bus_id=?`
    params = [specs, req.auth.bus_id]
  }
  //商品名称商品货号和是否是新品和是否是推荐为空
  if (name === '' && specs === '' && cate_id !== '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where cate_id=? and bus_id=?`
    params = [cate_id, req.auth.bus_id]
  }
  // 商品货号和商品分类和是否是新品和是否是推荐为空
  if (name !== '' && specs === '' && cate_id === '' && is_new === '0' && is_recommend === '0') {
    sql = `select * from goods where goods_name=? and bus_id=?`
    params = [name, req.auth.bus_id]
  }
  //#endregion
  db.query(sql, params, (err, result) => {
    if (err) return res.cc(err)
    res.send({ code: 0, msg: '数据获取成功！', data: result })
  })
}

// 编辑商品信息
exports.editGoodsInfo = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 2. 根据商品货号和商品id查询数据库中商品是否存在
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]
  const no = req.body.no
  const sql = `select * from goods where id=? and article_no=? and bus_id=?`
  db.query(sql, [id, no, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.length === 0) return res.cc('修改的商品信息不存在！')
    // 3. 创建更新时间
    const date = new Date()
    const update_time = date.toLocaleDateString() + ' ' + date.toLocaleTimeString()
    // 4. 更新商品数据
    const sql = `update goods set ? where id=? and article_no=? and bus_id=?`
    // 5. 返回响应
    db.query(
      sql,
      [
        {
          goods_name: req.body.name,
          goods_desc: req.body.desc,
          goods_price: req.body.price,
          goods_stock: req.body.count,
          update_time,
          cate_id: req.body.cate_id,
          is_recommend: req.body.recommend,
          is_new: req.body.new,
          specs: req.body.specs,
          is_banner: req.body.banner
        },
        id,
        no,
        req.auth.bus_id
      ],
      (err, result) => {
        if (err) return res.cc(err)
        if (result.affectedRows !== 1) return res.cc('更新商品信息失败！')
        res.cc('更新商品信息成功！', 0)
      }
    )
  })
}

// 批量切换商品是否是新品或者是否是推荐
exports.toggleNewOrRecommend = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 2. 判断是切换新品还是推荐
  let params = ''
  let sql = ``
  if (req.body.is_new === undefined && req.body.is_recommend === undefined) return res.cc('请选择需要进行的操作！')

  if (req.body.is_new !== undefined && req.body.is_recommend === undefined) {
    params = req.body.is_new
    sql = `update goods set is_new=?, update_time=? where id=? and bus_id=?`
  }

  if (req.body.is_recommend !== undefined && req.body.is_new === undefined) {
    params = req.body.is_recommend
    sql = `update goods set is_recommend=?, update_time=? where id=? and bus_id=?`
  }
  // 3. 将用户传递的商品id
  let ids = req.body.ids
  if (!/\d/.test(ids[ids.length - 1])) {
    ids = ids.slice(0, ids.length - 1).split(',')
  } else {
    ids = ids.split(',')
  }
  // 4. 执行sql语句修改商品数据
  const sqlArr = []
  for (let i = 0; i < ids.length; i++) {
    const update_time = new Date()
    sqlArr.push({
      sql,
      values: [params, update_time, ids[i], req.auth.bus_id]
    })
    // 当添加到最后一个执行sql
    if (i === ids.length - 1) {
      try {
        await execTransAction(sqlArr)
        res.send({
          code: 0,
          msg: '更新商品数据完成!'
        })
      } catch (err) {
        res.cc(err)
      }
    }
  }
}
// 切换商品是否是新品
exports.toggleNew = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 2. 获取商品id
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]
  // 3. 创建更新时间
  const date = new Date()
  const update_time = date.toLocaleDateString() + ' ' + date.toLocaleTimeString()
  // 4. 定义sql语句更新是否是新品状态
  const sql = `update goods set is_new=?, update_time=? where id=? and bus_id=?`
  db.query(sql, [req.body.is_new, update_time, id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('更新商品数据失败！')
    // 5. 返回响应
    res.cc('更新商品数据成功！', 0)
  })
}

// 切换商品是否是推荐
exports.toggleRecommend = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 2. 获取商品id
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]

  // 3. 创建更新时间
  const date = new Date()
  const update_time = date.toLocaleDateString() + ' ' + date.toLocaleTimeString()

  // 4. 执行sql语句更新商品是否是推荐状态
  const sql = `update goods set is_recommend=?, update_time=? where id=? and bus_id=?`
  db.query(sql, [req.body.recommend, update_time, id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('更新商品数据失败！')
    //5. 返回响应
    res.cc('更新商品数据成功！', 0)
  })
}

// 切换是否是轮播图
exports.toggleBanner = async (req, res) => {
  // 1. 验证用户身份
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)

  // redis数据库中token不存在
  if (!redisToken) return res.cc('身份验证失败！', 403)

  // 用户携带的token与redis token不一致
  if (token !== redisToken) return res.cc('身份验证失败！', 403)

  // 2. 获取商品id
  const pathArr = req.path.split('/')
  const id = pathArr[pathArr.length - 1]

  // 3. 创建更新时间
  const date = new Date()
  const update_time = date.toLocaleDateString() + ' ' + date.toLocaleTimeString()

  // 4. 执行sql语句更新商品是否是推荐状态
  const sql = `update goods set is_banner=?, update_time=? where id=? and bus_id=?`
  db.query(sql, [req.body.banner, update_time, id, req.auth.bus_id], (err, result) => {
    if (err) return res.cc(err)
    if (result.affectedRows !== 1) return res.cc('更新商品数据失败！')
    //5. 返回响应
    res.cc('更新商品数据成功！', 0)
  })
}
//#endregion

// 获取商家订单数据
exports.getOrderList = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2. 获取商家订单列表
  const sql = `select * from bus_orders where bus_id=?`
  const result = await execTransAction([
    {
      sql,
      values: req.auth.bus_id
    }
  ])
  const queryGoodsPrice = result[0].rows.map((item) => {
    return {
      sql: `select goods_price from goods where id=? and bus_id=?`,
      values: [item.goods_id, req.auth.bus_id]
    }
  })
  try {
    const queryPriceResult = await execTransAction(queryGoodsPrice)
    const resultSend = queryPriceResult.map((item, index) => {
      return {
        ...result[0].rows[index],
        goods_price: item.rows[0].goods_price
      }
    })
    if (result[0].rows.length === 0) {
      res.send({
        code: 0,
        msg: '暂无订单数据！',
        data: []
      })
    } else {
      res.send({
        code: 0,
        msg: '订单数据获取成功！',
        data: resultSend
      })
    }
  } catch (err) {
    res.cc(err)
  }
}

// 删除订单
exports.delOrderById = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2. 获取传递的订单id
  const id = req.body.id

  // 3. 根据id查询订单信息是否存在
  const sql = `select * from bus_orders where id=? and bus_id=?`
  const queryResult = await execTransAction([
    {
      sql,
      values: [id, req.auth.bus_id]
    }
  ])
  if (queryResult[0].rows.length === 0) return res.cc('该订单信息不存在！')
  // 4. 删除订单数据
  try {
    const deleteSql = `delete from bus_orders where id=? and bus_id=?`
    const selResult = await execTransAction([
      {
        sql: deleteSql,
        values: [id, req.auth.bus_id]
      }
    ])
    // 5. 返回相应
    if (selResult[0].rows.affectedRows !== 0) {
      res.cc('删除成功！', 0)
    } else {
      res.cc('删除失败！')
    }
  } catch (err) {
    res.cc(err)
  }
}

// 根据id获取订单详情数据
exports.getOrderById = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2. 获取用户传递的订单编号
  const id = req.query.id
  // 3. 查询订单数据
  const sql = `select * from bus_orders where id=? and bus_id=?`
  try {
    const queryResult = await execTransAction([{ sql, values: [id, req.auth.bus_id] }])
    // 4. 返回响应
    if (queryResult[0].rows.length === 0) {
      res.send({
        code: 0,
        msg: '订单数据不存在！',
        data: []
      })
    } else {
      const sqlArr = queryResult[0].rows.map((item) => {
        return {
          sql: `select * from goods where id=? and bus_id=?`,
          values: [item.goods_id, req.auth.bus_id]
        }
      })
      const queryGoodsResult = await execTransAction(sqlArr)
      const results = queryGoodsResult[0].rows.map((item, index) => {
        return {
          orderInfo: { ...queryResult[0].rows[index] },
          goodsInfo: { ...item }
        }
      })
      res.send({
        code: 0,
        msg: '订单数据查询成功！',
        data: results
      })
    }
  } catch (err) {
    res.cc(err)
  }
}

// 批量操作订单
exports.delOrSendByOption = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2. 获取用户传递的订单参数
  let ids = req.body.ids
  const option = req.body.option

  if (!/\d/.test(ids[ids.length - 1])) {
    ids = ids.slice(0, ids.length - 1).split(',')
  } else {
    ids = ids.split(',')
  }
  // 3. 查询所传递的id对应的订单状态是都全部是
  let sqlArr
  // 3. 根据option定义sql语句
  if (option === 'delete') {
    sqlArr = ids.map((item) => {
      return { sql: `delete from bus_orders where id=? and bus_id=?`, values: [item, req.auth.bus_id] }
    })
  } else {
    sqlArr = ids.map((item) => {
      return { sql: `select * from bus_orders where id=? and bus_id=? and order_status=1`, values: [item, req.auth.bus_id] }
    })
  }

  try {
    // 4. 执行sql语句查询所有待发货订单数据库数据
    const queryResult = await execTransAction(sqlArr)
    sqlArr = []
    queryResult
      .filter((item) => item.rows.length !== 0)
      .forEach((item) => {
        sqlArr.push(
          { sql: `update bus_orders set order_status=2,send_goods_time=? where id=? and bus_id=? and order_status=1`, values: [new Date(), item.rows[0].id, req.auth.bus_id] },
          {
            sql: `update user_orders set order_status=2,update_time=? where order_id=? and goods_id=? and user_id=? and order_status=1`,
            values: [new Date(), item.rows[0].order_id, item.rows[0].goods_id, item.rows[0].user_id]
          }
        )
      })
    // 5. 修改用户订单状态
    await execTransAction(sqlArr)
    // 5. 返回响应
    res.cc('操作成功！', 0)
  } catch (err) {
    res.cc(err)
  }
}

// 根据条件筛选订单数据
exports.filterOrderList = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2. 获取用户筛选条件
  const orderNo = req.query.orderNo
  const nameOrPhone = req.query.nameOrPhone
  const OrderStatus = req.query.OrderStatus

  let sql = `select * from bus_orders where bus_id=?`
  let values = [req.auth.bus_id]
  // 3. 根据筛选条件定义sql语句
  // 订单编号不为空
  if (orderNo && !nameOrPhone && !OrderStatus) {
    sql = `select * from bus_orders where bus_id=? and order_id=?`
    values = [req.auth.bus_id, orderNo]
  }

  // 收货人电话或者姓名不为空
  if (!orderNo && nameOrPhone && !OrderStatus) {
    sql = `select * from bus_orders where bus_id=? and (name=? || phone=?)`
    values = [req.auth.bus_id, nameOrPhone, nameOrPhone]
  }

  // 订单状态不为空
  if (!orderNo && !nameOrPhone && OrderStatus) {
    sql = `select * from bus_orders where bus_id=? and order_status=?`
    values = [req.auth.bus_id, OrderStatus]
  }

  // 订单编号和收货人信息不为空
  if (orderNo && nameOrPhone && !OrderStatus) {
    sql = `select * from bus_orders where bus_id=? and order_id=? and (phone=? || name=?)`
    values = [req.auth.bus_id, orderNo, nameOrPhone, nameOrPhone]
  }
  // 订单编号和订单状态不为空
  if (orderNo && !nameOrPhone && OrderStatus) {
    sql = `select * from bus_orders where bus_id=? and order_status=? and order_id=?`
    values = [req.auth.bus_id, OrderStatus, orderNo]
  }
  // 收货人信息和订单状态不为空
  if (!orderNo && nameOrPhone && OrderStatus) {
    sql = `select * from bus_orders where bus_id=? and order_status=? and (phone=? || name=?)`
    values = [req.auth.bus_id, OrderStatus, nameOrPhone, nameOrPhone]
  }
  // 三个条件都不为空
  if (orderNo && nameOrPhone && OrderStatus) {
    sql = `select * from bus_orders where bus_id=? and order_status=? and order_id=? and (phone=? || name=?)`
    values = [req.auth.bus_id, OrderStatus, orderNo, nameOrPhone, nameOrPhone]
  }

  try {
    // 4. 根据筛选条件查询订单数据
    const queryResult = await execTransAction([
      {
        sql,
        values
      }
    ])

    // 5. 根据订单信息查询商品价格
    const sqlArr = queryResult[0].rows.map((item) => {
      return {
        sql: 'select goods_price from goods where id=? and bus_id=?',
        values: [item.goods_id, req.auth.bus_id]
      }
    })

    const queryGoodsResult = await execTransAction(sqlArr)
    const results = queryGoodsResult.map((item, index) => {
      return {
        ...queryResult[0].rows[index],
        goods_price: item.rows[0].goods_price
      }
    })
    // 6. 返回响应
    res.send({
      code: 0,
      msg: ' 订单数据获取成功！',
      data: results
    })
  } catch (err) {
    res.cc(err)
  }
}

// 获取待处理订单数据
exports.getNeedDealOrderList = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2. 查询代发货的订单数据
  const sql = `select * from bus_orders where order_status=1 and bus_id=?`
  try {
    const queryResult = await execTransAction([
      {
        sql,
        values: [req.auth.bus_id]
      }
    ])

    if (queryResult[0].rows.length === 0) {
      res.send({
        code: 0,
        msg: '暂无待处理订单！',
        data: []
      })
    } else {
      // 3. 获取商品对应的价格
      const sqlArr = queryResult[0].rows.map((item) => {
        return {
          sql: `select goods_price from goods where id=? and bus_id=?`,
          values: [item.goods_id, req.auth.bus_id]
        }
      })
      const queryGoodsResult = await execTransAction(sqlArr)
      const results = queryGoodsResult.map(({ rows }, index) => {
        return {
          ...queryResult[0].rows[index],
          goods_price: rows[0].goods_price
        }
      })
      // 3. 返回响应
      res.send({
        code: 0,
        msg: '待处理订单数据获取成功！',
        data: results
      })
    }
  } catch (err) {
    console.log(err)
    res.cc(err)
  }
}

// 根据条件获取待处理订单数据
exports.filterDealOrderList = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2. 获取用户筛选条件
  const orderNo = req.query.orderNo
  const nameOrPhone = req.query.nameOrPhone

  // 3. 根据筛选条件定义sql语句
  let sql = `select * from bus_orders where bus_id=? and order_status=1`
  let values = [req.auth.bus_id]
  // 3. 根据筛选条件定义sql语句
  // 订单编号不为空
  if (orderNo && !nameOrPhone) {
    sql = `select * from bus_orders where bus_id=? and order_id=? and order_status=1`
    values = [req.auth.bus_id, orderNo]
  }
  // 收货人信息不为空
  if (!orderNo && nameOrPhone) {
    sql = `select * from bus_orders where bus_id=? and (name=? || phone=?) and order_status=1`
    values = [req.auth.bus_id, nameOrPhone, nameOrPhone]
  }
  // 筛选条件都不为空
  if (orderNo && nameOrPhone) {
    sql = `select * from bus_orders where bus_id=? and order_id=? and (name=? || phone=?) and order_status=1`
    values = [req.auth.bus_id, orderNo, nameOrPhone, nameOrPhone]
  }

  // 4. 查询数据库中的数据
  try {
    const queryResult = await execTransAction([
      {
        sql,
        values
      }
    ])
    if (queryResult[0].rows.length === 0) {
      res.send({
        code: 0,
        msg: '暂无满足条件的订单信息！',
        data: []
      })
    } else {
      const sqlArr = queryResult[0].rows.map((item) => {
        return {
          sql: 'select goods_price from goods where id=? and bus_id=?',
          values: [item.goods_id, req.auth.bus_id]
        }
      })
      const queryGoodsPrice = await execTransAction(sqlArr)
      const results = queryGoodsPrice.map((item, index) => {
        return {
          ...queryResult[0].rows[index],
          goods_price: item.rows[0].goods_price
        }
      })
      // 4. 返回响应
      res.send({
        code: 0,
        msg: '筛选成功！',
        data: results
      })
    }
  } catch (err) {
    res.cc(err)
  }
}

// 发货
exports.orderDeliver = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }

  // 2.获取用户传递的订单id
  const id = req.body.id
  console.log(id)
  // 3. 查看订单数据是否存在
  const sql = `select * from bus_orders where id=? and bus_id=?`
  try {
    const queryResult = await execTransAction([
      {
        sql,
        values: [id, req.auth.bus_id]
      }
    ])
    if (queryResult[0].rows.length === 0) {
      return res.cc('订单信息不存在！')
    } else {
      const orderInfo = queryResult[0].rows[0]
      // 4. 更新数据库数据
      const sqlArr = [
        { sql: `update bus_orders set order_status=2,send_goods_time=? where id=? and bus_id=? and order_status=1`, values: [new Date(), orderInfo.id, req.auth.bus_id] },
        {
          sql: `update user_orders set order_status=2,update_time=? where order_id=? and goods_id=? and user_id=? and order_status=1`,
          values: [new Date(), orderInfo.order_id, orderInfo.goods_id * 1, orderInfo.user_id]
        }
      ]
      await execTransAction(sqlArr)
      // 5. 返回响应
      res.cc('发货成功！', 0)
    }
  } catch (err) {
    res.cc(err)
  }
}

// 获取账单数据
exports.getAccountList = async (req, res) => {
  // 1. 判断用户token是否正确
  const token = req.headers.authorization

  // 获取redis数据库中的token
  const redisToken = await redisClient.get('bus_token_' + req.auth.bus_id)
  // redis数据库中token不存在
  if (!redisToken) {
    return res.cc('身份信息已过期！', 403)
  }
  // 用户携带的token与redis token不一致
  if (token !== redisToken) {
    return res.cc('用户身份信息错误！', 403)
  }
  // 2. 获取商家订单列表
  const sql = `select * from bus_account where bus_id=?`
  const result = await execTransAction([
    {
      sql,
      values: req.auth.bus_id
    }
  ])
  if (result[0].rows.length === 0) {
    res.send({
      code: 0,
      msg: '暂无账单数据！',
      data: []
    })
  } else {
    res.send({
      code: 0,
      msg: '账单数据获取成功！',
      data: result[0].rows
    })
  }
}
